#include "EventLoopThread.h"
#include "EventLoop.h"
// 由EventLoopThread创建一个线程
EventLoopThread::EventLoopThread(const ThreadInitCallback &cb,
                                 const std::string &name)
    : loop_(nullptr), exiting_(false), thread_(std::bind(&EventLoopThread::threadFunc, this), name), mutex_(), cond_(), callback_(cb)
{
}

EventLoopThread::~EventLoopThread()
{
    exiting_ = true;
    if (loop_ != nullptr)
    {
        loop_->quit();
        thread_.join();
    }
}

EventLoop *EventLoopThread::startLoop() // 这里才创建新线程
{
    // 启动底层的线程
    thread_.start(); // start 里面的func_ 就是 EventLoopThread::threadFunc，也就是下面的函数得执行完才到我
    EventLoop *loop = nullptr;
    {
        std::unique_lock<std::mutex> lock(mutex_);
        while (loop_ == nullptr)
        {
            cond_.wait(lock); // 表示底层的线程都没创建好
        }
        loop = loop_;
    }
    // loop.loop(); // EventLoop loop =>Poller.poll
    return loop;
}

// 这个是新线程执行的函数
void EventLoopThread::threadFunc()
{
    EventLoop loop; // one loop per thread
    if (callback_)
    {
        callback_(&loop);
    }
    {
        std::unique_lock<std::mutex> lock(mutex_);
        loop_ = &loop;
        cond_.notify_one();
    }
    loop.loop(); // 执行一次loop方法
    std::unique_lock<std::mutex> lock(mutex_);
    loop_ = nullptr; // 到这里已经说明新线程的Reactor 退出了，不继续执行了。
}